import CryptoJS from 'crypto-js'

/**
 * 小程序解密数据类
 * @author emhome<emhome@163.com>
 */
export default class WXBizDataCryptoJs {
  constructor (sessionKey, appId) {
    this.appId = appId || process.env.MPAPPID
    this.sessionKey = sessionKey || wx.getStorageSync('sessionKey')
  }

  /**
   * 获取加密解密使用的向量
   * @param {*} iv
   */
  getCryptoIV (iv) {
    return this.parseFormat(iv)
  }

  /**
   * 获取加密解密使用的密钥
   * @param {*} key
   */
  getCryptoKey (key) {
    return this.parseFormat(key || this.sessionKey)
  }

  /**
   * 格式化加密选项
   * @param {*} data
   */
  parseFormat (data) {
    var base64DecodeKey = CryptoJS.enc.Base64.parse(data).toString()
    return CryptoJS.enc.Hex.parse(base64DecodeKey)
  }

  /**
   * 解析解密后的数据内容
   * @param {*} data
   */
  parseResult (data) {
    var result = CryptoJS.enc.Utf8.stringify(data).toString()
    return JSON.parse(result)
  }

  /**
   * Configuration options.
   * @param {*} iv 向量
   */
  getCipherOption (iv) {
    return {
      iv: this.getCryptoIV(iv),
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    }
  }

  /**
   * 解密
   * @param {*} data 加密数据
   * @param {*} iv 向量
   */
  decrypt (data, iv, key) {
    var secret = this.getCryptoKey(key)
    var cfg = this.getCipherOption(iv)
    try {
      const decrypt = CryptoJS.AES.decrypt(data, secret, cfg)
      var decryptData = this.parseResult(decrypt)
      console.log('result:', decryptData)
    } catch (err) {
      throw new Error(err)
    }
    if (decryptData.watermark.appid !== this.appId) {
      throw new Error('This AppId `' + this.appId + '` is not unauthorized applications.')
    }
    return decryptData
  }
}
